package muhnes.sizoo.dal;

import java.io.Serializable;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

public abstract class GenericoDAO< T, ID extends Serializable > {
    
    protected SessionFactory creadorSesiones;
    
    public GenericoDAO () {
    }
    
    public GenericoDAO ( SessionFactory creadorSesiones ) {
        this.creadorSesiones = creadorSesiones;
    }
    
    public SessionFactory getSesion () {
        return this.creadorSesiones;
    }
    
    public void setSesion ( SessionFactory creadorSesiones ) {
        this.creadorSesiones = creadorSesiones;
    }
    
    protected abstract String getConsultaPorId ( ID id );
    
    protected abstract String getConsultaPorEntidad ();

    public void guardar ( T entidad ) {
        Session sesion = creadorSesiones.getCurrentSession();
        sesion.save( entidad );
    }

    public void guardarColeccion ( List< T > entidades ) {
        Session sesion = creadorSesiones.getCurrentSession();
        sesion.saveOrUpdate( entidades );
    }

    public void actualizar ( T entidad ) {
        Session sesion = creadorSesiones.getCurrentSession();
        sesion.update( entidad );
    }

    public void actualizarColeccion ( List< T > entidades ) {
        Session sesion = creadorSesiones.getCurrentSession();
        sesion.update( entidades );
    }

    public void eliminar ( T entidad ) {
        Session sesion = creadorSesiones.getCurrentSession();
        sesion.delete( entidad );
    }

    public void eliminarColeccion ( List< T > entidades ) {
        Session sesion = creadorSesiones.getCurrentSession();
        sesion.delete( entidades );
    }

    public void eliminarPorId ( ID id ) {
        Session sesion = creadorSesiones.getCurrentSession();
        T entidad = buscarPorId( id );
        sesion.delete( entidad );
    }

    public T buscarPorId ( ID id ) {
        Session sesion = creadorSesiones.getCurrentSession();        
        String hql = getConsultaPorId( id );
        Query consulta = sesion.createQuery( hql );
        T entidad = (T)consulta.uniqueResult();
        return entidad;
    }

    public List< T > buscarTodos () {
        Session sesion = creadorSesiones.getCurrentSession();        
        String hql = getConsultaPorEntidad();
        Query consulta = sesion.createQuery( hql );
        List< T > entidades = consulta.list();
        return entidades;
    }
    
}
